package com.example.service.impl;

import com.example.entity.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class UserServiceImpl {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Resource(name = "redisTemplate")
    private ValueOperations<String,String> string;

    /**
     * RedisTemplate 模拟操作String类型(结构)
     */
    /**
     * Redis完成缓存功能（String类型操作）
     * 1.判断Redis中是否存在key
     * 如果key存在，直接查询redis
     * 如果key不存在，查询mysql数据库，将查询结果保存到redis中，并返回.
     */

    public String getUserName(String id){
        String key = "user:name:" + id;
        if (redisTemplate.hasKey(key)){
            log.info("查询的是Redis-----》");
//            Object result = redisTemplate.opsForValue().get(key);
//            return (String) result;
            return string.get(key);
        }else {
            log.info("查询的是数据库");
            String result = "张三";
//            redisTemplate.opsForValue().set(key,result);
            string.set(key,result);
            redisTemplate.expire(key,10, TimeUnit.HOURS);
            return result;
        }
    }

    /**
     * 对象Redis,hash类型进行存储
     * 根据用户ID查询用户信息
     * 1.根据用户的ID生成Redis KEY
     * 2.判断Redis中是否存在该Key
     * 3.如果key不存在，查询mysql数据库，将查询结果存入redis hash类型，并返回结果
     * 4。如果key存在，直接查询Redis返回
     */
    @Resource(name = "redisTemplate")
    private HashOperations<String,String,User> hash;

    public User selectUserById(String id){

//        String key = "user:" + id;
        if (!hash.hasKey("user",id)){
            log.info("查询的是mysql数据库");
            User user = new User();
            user.setRemark("测试描述01");
            user.setName("张三");
            user.setId("1");
//            redisTemplate.opsForHash().put("user",id,user);
            hash.put("user",id,user);
            return user;
        }else {
            log.info("查询的是redis");
//            Object obj = redisTemplate.opsForHash().get("user", id);
//            return (User) obj;
            return hash.get("user",id);
        }
    }
}
